/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package commonlib.domain;

/**
 *
 * @author jorge.daniel.negrete
 */

import java.util.ArrayList;
import java.util.Iterator;






public class Rules {
	private TST<IntTSTPair> regla;
  public Rules()
  {
	  this.regla=new TST<IntTSTPair>();
  }
  public void addRule(ABPair regla,int f)
  {
	  if(this.regla.contains(regla.getAlpha()))
	  {
		  IntTSTPair aux=this.regla.getDade(regla.getAlpha());
		  aux.setBeta(regla.getBeta(),f);
		  aux.incAlpha(f);
		  this.regla.setDade(regla.getAlpha(),aux);

	  }
	  else
	  {
		  IntTSTPair aux=new IntTSTPair();
		  aux.setBeta(regla.getBeta(),f);
		  aux.incAlpha(f);
		  this.regla.add(regla.getAlpha(),aux);
	  }
  }
  public boolean findRule(ABPair regla)
  {
	  if(this.regla.contains(regla.getAlpha()))
	  {
		  IntTSTPair aux=this.regla.getDade(regla.getAlpha());
		  if(aux.findBeta(regla.getBeta()))
		  {
			  return true;
		  }
		  else
		  {
			  return false;
		  }
	  }
	  else
	  {
		  return false;
	  }
  }

  public void addRuleList(ArrayList<ABPair> a,ArrayList<Integer> f)
   {
	  Iterator<ABPair> aux=a.iterator();
	  Iterator<Integer> aux2=f.iterator();
	  while((aux.hasNext())&&(aux2.hasNext()))
	  {
		  this.addRule(aux.next(),aux2.next().intValue());
	  }
   }
   public IteratorTST<Integer> findAlpha(String Alpha)
   {
	  IntTSTPair aux=this.regla.getDade(Alpha);
	  return aux.getIteratorBeta();
   }
   public float getRuleProb(ABPair regla)
   {
	   if(this.regla.contains(regla.getAlpha()))
	   {
		   IntTSTPair aux=this.regla.getDade(regla.getAlpha());
		   if(aux.findBeta(regla.getBeta()))
		   {
			   float r;
			   r=(float)aux.getContBeta(regla.getBeta())/aux.getContAlpha();

			   return r;
		   }
	   }
	   return 0;
   }
   public boolean deleteRule(ABPair regla)
   {
	   if(this.findRule(regla))
	   {
	     IntTSTPair A;
	     A=this.regla.getDade(regla.getAlpha());
	     A.deleteBeta(regla.getBeta());
	     this.regla.setDade(regla.getAlpha(),A);
	     return true;
	   }
	   else
	   {
		  return false;
	   }

   }
 }

